﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework;
using Knights.Recursos;
using Knights.Objeto;

namespace Knights
{
    class Mundo
    {
        private static Mundo instancia = null;
        private static Personaje miPersonaje;
        
        private Juego juego;
        private Terreno terreno;
        private Effect efecto;

        private List<IObjeto> objetosDelMundo;
        private List<IObjeto> objetosARemover;

        public static Mundo CrearInstancia(Personaje personaje, Juego juego)
        {
            if (instancia == null)
                instancia = new Mundo(personaje, juego);

            return instancia;
        }

        private Mundo(Personaje personaje, Juego juego)
        {
            miPersonaje = personaje;

            this.juego = juego;
            objetosDelMundo = new List<IObjeto>();
            objetosARemover = new List<IObjeto>();

            Inicializar();
        }

        private void Inicializar()
        {
            AgregarObjeto(miPersonaje);

            terreno = new Terreno(Texturas.Mapa.Width, Texturas.Mapa.Height);
            efecto = juego.Content.Load<Effect>("efecto");

            CargadorMapa.CargarMapaMundo(this);
        }

        public void AgregarObjeto(IObjeto objeto)
        {
            objetosDelMundo.Add(objeto);
        }

        public void RemoverObjeto(IObjeto objeto)
        {
            objetosARemover.Add(objeto);
        }

        public void Actualizar()
        {
            objetosARemover = new List<IObjeto>();
            objetosDelMundo.Sort();

            foreach (IObjeto objeto in objetosDelMundo)
            {
                try
                {
                    objeto.Actualizar();
                }
                catch { }
            }

            //if (objetosARemover.Count > 0)
            //    RemoverObjetos();
        }

        public void Dibujar()
        {
            terreno.Dibujar(efecto);

            foreach (IObjeto objeto in objetosDelMundo)
            {
                try
                {
                    objeto.Dibujar(efecto);
                }
                catch { }
            }
        }

        //private void RemoverObjetos()
        //{
        //    IObjeto objetoARemover = objetosARemover[0];
        //    float distanciaMinima = objetoARemover.Distancia;

        //    for (int i = 1; i < objetosARemover.Count; i++)
        //    {
        //        if (objetosARemover[i].Distancia < distanciaMinima)
        //        {
        //            objetoARemover = objetosARemover[i];
        //            distanciaMinima = objetoARemover.Distancia;
        //        }
        //    }

        //    objetosDelMundo.Remove(objetoARemover); //solo remueve el mas cercano
        //}

        public static Personaje PersonajePrincipal { get { return miPersonaje; } }

        public static List<IObjeto> Objetos { get { return instancia.objetosDelMundo; } }
    }
}
